package main

import "fmt"

type ListNode struct {
	Val int
	Next *ListNode
}

func main() {
	c := ListNode{
		Val: 3,
	}
	b := ListNode{
		Val:  2,
		Next: &c,
	}
	a := ListNode{
		Val:  1,
		Next: &b,
	}
	fmt.Println(lens(&a))
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	if lens(l1) < lens(l2) {
		l1, l2 = l2, l1
	}

	return add(l1, l2, false)
}

func lens(l *ListNode) int {
	if l == nil {
		return 0
	} else if l.Next == nil {
		return 1
	} else {
		return lens(l.Next) + 1
	}
}

func add(l1 *ListNode, l2 *ListNode, carry bool) *ListNode {
	if l1 == nil {
		if carry {
			return &ListNode{Val: 1}
		} else {
			return nil
		}
	}
	result := 0
	if carry {
		result ++
	}
	carry = false
	result += l1.Val
	if l2 != nil {
		result += l2.Val
	}
	if result >= 10 {
		carry = true
		result -= 10
	}

	l1.Val = result
	if l2 != nil {
		l2 = l2.Next
	}
	tmp := add(l1.Next, l2, carry)
	if l1.Next == nil {
		l1.Next = tmp
	}

	return l1
}